#define _XOPEN_SOURCE
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<iostream>

volatile int count = 0;
void handler(int signnumber)
{
    count++;
    std::cout<<"the sign number is "<<signnumber<<"the count = "<<count<<std::endl;
}
//count 在主输出流没有修改
//volatile 易变关键字
int main()
{
    std::cout<<"I am a process  the pid is "<<getpid()<<std::endl;
    signal(2,handler);
    while(!count);
    std::cout<<"我要正常退出了"<<std::endl;
}
/*
//第一个测试代码是 看看pending 表是什么时候修改的 还有bloc表
void PrintBlock()
{
    sigset_t tmp;
    sigpending(&tmp);
    for(int i=31;i>0;i--)
    {
        if(sigismember(&tmp,i))
        {
            printf("1");
        }
        else
        {
            printf("0");
        }
    }
     printf("\n");
}
void PrintPend()
{
    //捕捉到信号会把pending表设置成1 
    //什么时候修改回 0 的呢 是在处理信号结束后 还是信号处理前
    //答案是信号处理前就会把pending 设置成0 
    //否则会混淆是处理前收到的信号 还是处理中收到的信号
    //要是在信号处理后设置成0 那么在处理中接受到信号 是不是就会设置成1了
    //那么你怎么分的清楚 是何时接受到的信号 
    sigset_t  tset,oset;
    sigemptyset(&tset);
    sigemptyset(&oset);
    sigprocmask(SIG_BLOCK,&tset,&oset);//SIG_BLOCK 是加上tset 如果全是0 的话 相当于什么都没干
    for(int i=31;i>0;i--)
    {
        if(sigismember(&oset,i))
        {
            printf("1");
        }
        else
        {
            printf("0");
        }
    }
    printf("\n");
}
void handler(int signnumber)
{
   
    while(true)
    {
        printf("the sign number is %d " ,signnumber);
        PrintPend();
        sleep(1);
    }

}
int main()
{
    struct sigaction  act,oact;
    act.sa_handler=handler;
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask,3);
    sigaddset(&act.sa_mask,4);
    sigaddset(&act.sa_mask,5);
    sigaddset(&act.sa_mask,6);
    sigaddset(&act.sa_mask,7); 
    //也是对二号信号的捕捉 ，和sigpromask(how,set,oset) 的区别是  
    //sigaction 对你要捕捉的信号进行捕捉，并且自动把你进程的pending表对应的信号位置
    //设置成1 并且把你要设置的pending 一起设置进去
    //sigprocmask 是直接把block的值和set进行计算
    sigaction(2,&act,&oact);
    while(true)
    {
        pause();
    }
    
}*/